import { Injectable } from '@nestjs/common';
import { CreateUserDto } from './dto/create-user.dto';
import { UpdateUserDto } from './dto/update-user.dto';
import { InjectRepository } from '@nestjs/typeorm';
import { User } from './entities/user.entity';
import { Repository } from 'typeorm';
import { Logs } from 'src/logs/logs.entity';

@Injectable()
export class UserService {

    constructor(
        @InjectRepository(User)
        private userPepository: Repository<User>,

        // 注入日志实体
        @InjectRepository(Logs)
        private logsPepository: Repository<Logs>
    ) { }

    async create(createUserDto: CreateUserDto) {
        return await this.userPepository.save(createUserDto);
    }

    async findAll() {
        return await this.userPepository.find(); // find方法 查询所有
    }

    async findOne(id: string) {
        return await this.userPepository.findOne({ where: { id } });
    }

    // 第一个参数是 userId  第二个参数是要修改的对象
    async update(id: string, updateUserDto: UpdateUserDto) {
        return await this.userPepository.update(id, updateUserDto);
    }

    async remove(id: string) {
        return await this.userPepository.delete(id);
    }


    // 以下是联表查询 
    // 一对一联表  user - profile
    async findProfile(id: string) {
        // 控制是否展示profile
        return await this.userPepository.findOne({
            where: { id }, relations: { profile: true }
        })
    }

    // 一对多联表查询  user - logs
    async findLogs(id: string) {
        // userRepository.findOne 方法查找指定用户，并通过 relations 选项关联 logs 表，然后获取关联的日志数据
        return await this.userPepository.findOne({ where: { id }, relations: ['logs'] });
    }


    // QueryBuilder 查询
    // 查询日志 并分组（以练习为主）  可以支持原生sql  看最下面
    async findLogsByGroup(id: string) {
        /* 
        SELECT
            l.code , COUNT(l.`code`) count
        FROM `logs` l , `user` u WHERE u.id = l.userId AND u.id = '083293c7-47f6-4f61-9fa6-af671cab7a8c' GROUP BY l.`code` ;
        */

        return this.logsPepository
            .createQueryBuilder('logs')  // 查询哪张表
            .select('logs.code', 'code')  // 查询的属性  第二个参数 别名
            .addSelect('Count("logs.code")', 'count')  // 查询的属性  第二个参数 别名
            .leftJoinAndSelect('logs.user', 'user')  // 左连接  
            .where('user.id = :id', { id })  // 查询条件
            .groupBy('logs.code')    // 分组
            .orderBy('code' , 'ASC')  //  ASC 正序  DESC 倒序
            .limit(3)                 // 页码
            .offset(0)                 // 偏移量
            .getRawMany();


        /* 
        SELECT
            l.`code` , l.id , l.path , l.methods,
            JSON_OBJECT('id' , u.id , 'username' , u.username ) user 
        FROM `logs` l , `user` u WHERE u.id = l.userId AND u.id = '083293c7-47f6-4f61-9fa6-af671cab7a8c'; 
        将这条sql语句转换成QueryBuilder查询
        */

        // return await this.logsPepository
        //     .createQueryBuilder('logs')
        //     .leftJoinAndSelect('logs.user', 'user')  // 左连接 
        //     .select(['logs.code', 'logs.id', 'logs.path', 'logs.methods', 'JSON_OBJECT(\'id\', user.id, \'username\', user.username) AS user'])
        //     .where('user.id = :id', { id })  // 查询条件
        //     .getRawMany();


        
        /* 原生sql写法 不建议 
        return this.logsPepository.query(` 
        SELECT
            l.code , COUNT(l.code) count
        FROM logs l , user u WHERE u.id = l.userId AND u.id = '${id}' GROUP BY l.code ; 
        `)
        */
        
    }

}
